﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using tea.DB;
using tea.BL;
using tea.Models;

namespace tea.Controllers
{
    [Authorize]
    public class ApplicationController : Controller
    {
        [HttpGet]
        public ActionResult List()
        {
            // 자신의 지원 목록만 볼 수 있음
            using (var db = new DBDataContext()) {
                var 목록 = db.지원.Where(p => p.사용자ID == BL사용자.현재사용자.ID)
                                  .Select(p => new 지원Model(p))
                                  .ToList();
                return View(목록);
            }
        }

        [HttpGet]
        public ActionResult New()
        {
            using (var db = new DBDataContext()) {
                var redirectUrl = Url.Action("List", "Application");

                // 지원 신청 기간인가?
                var 채용 = db.채용.Where(p => p.신청기간1 <= DateTime.Now && DateTime.Now < p.신청기간2.AddDays(1))
                                  .OrderByDescending(p => p.ID)
                                  .FirstOrDefault();
                if (채용 == null) return View("_Redirect", new ErrorModel(Consts.지원기간아님, redirectUrl));

                // 이력서를 작성했는가?
                if (BL이력서.이력서작성했는가(db, BL사용자.현재사용자.ID) == false)
                    return View("_Redirect", new ErrorModel(Consts.이력서없음, redirectUrl));

                // 이 채용에 대해 이미 신청서를 작성했다면, 신규 작성하지 않고 편집 화면으로 이동
                var 지원 = db.지원.FirstOrDefault(p => p.채용ID == 채용.ID && p.사용자ID == BL사용자.현재사용자.ID);
                if (지원 != null) return Redirect(Url.Action("Form", "Application", new { id = 지원.ID }));

                var 모델 = new ApplicationFormModel {
                    지원 = new 지원Model {
                        이름 = BL사용자.현재사용자.이름,
                        생년월일 = db.이력서.Single(p => p.사용자ID == BL사용자.현재사용자.ID).생년월일
                    },
                    채용 = new 채용Model(채용),
                    ReturnURL = BL사용자.IsAdminOrStaff() ? Url.Action("ApproveList", "Application") : Url.Action("List", "Application"),
                    수정가능 = true
                };
                return View("Form", 모델);
            }
        }

        [HttpGet]
        public ActionResult Form(int id)
        {
            using (var db = new DBDataContext()) {
                var data = db.지원.Single(p => p.ID == id);

                if (BL지원.현재사용자가_지원신청서를_볼수있는가(data) == false)
                    return RedirectToAction("Logout", "User");

                var 채용 = new 채용Model(data.채용);
                var 지원기간인가 = 채용.신청기간1 <= DateTime.Now && DateTime.Now <= 채용.신청기간2.AddDays(1);
                var 모델 = new ApplicationFormModel {
                    지원 = new 지원Model(data),
                    채용 = 채용,
                    강의목록 = data.지원_강의.Select(p => p.강의).OrderBy(p => p.학기).ThenBy(p => p.강의명).ToList(),
                    ReturnURL = BL사용자.IsAdminOrStaff() ? Url.Action("ApproveList", "Application") : Url.Action("List", "Application"),
                    수정가능 = 지원기간인가 && BL지원.현재사용자가_지원신청서를_수정할수있는가(data)
                    
                };
                return View(모델);
            }
        }

        [HttpPost]
        [Util.AjaxOnly]
        public ActionResult SearchLecture(string pattern)
        {
            using (var db = new DBDataContext()) {
                var 모델 = new LectureSearchModel {
                    강의목록 = db.강의.Where(p => p.중단 == false && p.강의명.Contains(pattern)).OrderBy(p => p.학기).ThenBy(p => p.강의명).ToList()
                };
                return PartialView("_LectureDialog_Item", 모델);
            }
        }

        [HttpPost]
        [Util.AjaxOnly]
        public ActionResult Save(ApplicationFormSaveModel 모델)
        {
            using (var db = new DBDataContext()) {
                모델.강의ID = 모델.강의ID.Distinct().ToArray();

                // 지원 신청 기간이 아니면, 수정하여 저장할 수 없음.
                var 채용 = db.채용.Where(p => p.신청기간1 <= DateTime.Now && DateTime.Now < p.신청기간2.AddDays(1))
                                  .OrderByDescending(p => p.ID)
                                  .FirstOrDefault();
                if (채용 == null) return Json(new AjaxFailureModel(Consts.지원기간아님));

                // 이력서를 작성했는가?
                if (BL이력서.이력서작성했는가(db, BL사용자.현재사용자.ID) == false) 
                    return Json(new AjaxFailureModel(Consts.이력서없음));

                var data = db.지원.FirstOrDefault(p => p.ID == 모델.지원ID);
                if (data == null) {
                    var 새지원 = new DB.지원 {
                        사용자ID = BL사용자.현재사용자.ID,
                        채용ID = 채용.ID,
                        신청일 = DateTime.Now,
                        확인 = true
                    };
                    db.지원.InsertOnSubmit(새지원);
                    db.SubmitChanges();
                    foreach (var ID in 모델.강의ID) {
                        var 강 = db.강의.Single(p => p.ID == ID);
                        db.지원_강의.InsertOnSubmit(new DB.지원_강의 {
                            지원ID = 새지원.ID,
                            강의ID = ID
                        });
                    }
                    db.SubmitChanges();
                } else {
                    data.신청일 = DateTime.Now;
                    data.확인 = true;
                    db.지원_강의.DeleteAllOnSubmit(db.지원_강의.Where(p => p.지원ID == 모델.지원ID));
                    foreach (var ID in 모델.강의ID) {
                        var 강 = db.강의.Single(p => p.ID == ID);
                        db.지원_강의.InsertOnSubmit(new DB.지원_강의 {
                            지원ID = 모델.지원ID,
                            강의ID = ID
                        });
                    }
                    db.SubmitChanges();
                }
                return Json(Consts.Ajax저장됨);
            }
        }

        [HttpPost]
        [Util.AjaxOnly]
        public ActionResult Delete(int id)
        {
            using (var db = new DBDataContext()) {
                var 지원 = db.지원.Single(p => p.ID == id);
                if (BL지원.현재사용자가_지원신청서를_수정할수있는가(지원) == false)
                    return Json(Consts.Ajax권한없음);

                if (DateTime.Now >= 지원.채용.신청기간2)
                    return Json(new AjaxFailureModel(Consts.지원기간아님));

                db.지원_강의.DeleteAllOnSubmit(지원.지원_강의);
                db.지원.DeleteOnSubmit(지원);
                db.SubmitChanges();
                return Json(new AjaxSuccessModel(Url.Action("List", "Application")));
            }
        }


        [HttpGet]
        [Authorize(Roles = BL사용자.ADMIN_OR_STAFF)]
        public ActionResult ApproveList(int ID = 0)
        {
            using (var db = new DBDataContext()) {
                DB.채용 채 = (ID == 0) ? db.채용.OrderByDescending(p => p.ID).FirstOrDefault() : db.채용.FirstOrDefault(p => p.ID == ID);
                if (채 == null) return View("_Redirect", new ErrorModel(Consts.지원기간아님, Url.Action("List", "Recruit"))); ;

                var 목록 = db.지원.Where(p => p.채용ID == 채.ID)
                                  .Select(p => new 지원Model(p))
                                  .ToList();
                return View(목록);
            }
        }

        [Util.AjaxOnly]
        [Authorize(Roles = BL사용자.ADMIN_OR_STAFF)]
        public ActionResult Approve(int[] ID, bool value)
        {
            DateTime? dateValue = value ? DateTime.Now : (DateTime?)null;

            using (var db = new DBDataContext()) {
                foreach (var id in ID) {
                    var 지 = db.지원.FirstOrDefault(p => p.ID == id);
                    if (지 == null) continue;
                    지.승인일 = dateValue;
                }
                db.SubmitChanges();
                return Json(new AjaxSuccessModel(Url.Action("ApproveList", "Application")));
            }
        }

    }
}

